package repositories

import (
	"encoding/base64"
	"fmt"
	"golang.org/x/crypto/scrypt"
	"new_ginblog/internal/db"
	"new_ginblog/internal/middleware"
	"new_ginblog/internal/models"
	"new_ginblog/internal/utils/errormsg"
)

// CheckUser 检查用户是否已经存在
func CheckUser(username string) int {
	var user models.User
	db.DB.Select("id").Where("username = ? ", username).First(&user)
	if user.ID > 0 {
		return errormsg.ERROR_USERNAME_USED
	}

	return errormsg.ERROR_USERNAME_OK
}

// AddUser 增加用户
func AddUser(user *models.User) int {
	// 密码加密后在进行存储
	user.Password = Scrypt(user.Password)

	err := db.DB.Create(user).Error
	if err != nil {
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}

// GetUser 获取用户列表
func GetUser(pageSize int, pageNum int) ([]models.User, int, int64) {
	var users []models.User
	var total int64
	err := db.DB.Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users).Count(&total).Error
	if err != nil {
		return nil, errormsg.ERROR, 0
	}

	return users, errormsg.SUCCESS, total
}

// DeleteUser 删除用户
func DeleteUser(id int) int {
	err := db.DB.Where("id=?", id).Delete(&models.User{}).Error
	if err != nil {
		middleware.SugarLogger.Error(err)
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}

// UpdateUser 修改用户信息
func UpdateUser(id int, user *models.User) int {
	var data = map[string]interface{}{}
	data["username"] = user.Username
	data["role"] = user.Role
	err := db.DB.Model(&models.User{}).Where("id = ?", id).Updates(data).Error
	if err != nil {
		return errormsg.ERROR
	}
	return errormsg.SUCCESS
}

// Scrypt 密码加密函数
func Scrypt(password string) string {
	// 定义一个长度为8的byte类型字符切片
	salt := make([]byte, 8)
	salt = []byte{12, 23, 56, 12, 56, 12, 76, 12}
	const (
		KeyLen = 32    // 生成的密钥长度
		N      = 16384 // CPU/内存成本因子 值为 2的幂次
		r      = 8     // 块大小
		p      = 1     // 并行因子
	)
	HashPw, err := scrypt.Key([]byte(password), salt, N, r, p, KeyLen)
	if err != nil {
		fmt.Println(err)
	}

	// 对上面生成的密码哈希值进行了一次可读性的转换 便于数据的存储
	fpw := base64.StdEncoding.EncodeToString(HashPw)

	return fpw
}

// CheckLogin 检查用户的账号和密码是否正确
func CheckLogin(username, password string) int {
	var user models.User
	db.DB.Where("username = ?", username).Find(&user)
	if user.ID == 0 {
		return errormsg.ERROR_USER_NOT_EXIST
	}
	if user.Password != Scrypt(password) {
		return errormsg.ERROR_PASSWORD_WRONG
	}

	return errormsg.SUCCESS
}

// CheckUserRole 检查用户权限是否达标
func CheckUserRole(username, password string) int {
	var user models.User
	db.DB.Where("username = ?", username).Find(&user)
	if user.Role == 1 {
		return errormsg.SUCCESS
	} else {
		return errormsg.ERROR_USER_NOT_RIGHT
	}
}

// GetRole 获取用户身份码
func GetRole(username string) int {
	var user models.User
	db.DB.Where("username = ?", username).Find(&user)
	if user.Role != 0 {
		return user.Role
	}
	return 0
}

// GetRoleString 根据用户码返回对应的用户身份
func GetRoleString(role int) string {
	switch role {
	case 1:
		return "超级管理员"
	case 2:
		return "管理员"
	case 3:
		return "普通用户"
	default:
		return ""
	}
}
